package com.wei.czz.framework.blog.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.AuthLogin;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.comment.CommentDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.blog.BlogCommentVo;
import com.wei.czz.common.vo.admin.BlogUserOperationVo;
import com.wei.czz.framework.blog.manager.BlogCommentManager;
import com.wei.czz.framework.blog.service.BlogUserOperationService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-30 17:46:34
 * className: BlogUserOperationController 用户操作博客请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("blog/user-blog")
@AllArgsConstructor
public class BlogUserOperationController {

    private static final Logger log = LoggerFactory.getLogger(BlogUserOperationController.class);

    private final BlogUserOperationService blogUserOperationService;

    private final BlogCommentManager blogCommentManager;

    /**
     * 判断用户是否点赞和是否收藏博客接口
     * 根据用户id和博客id，判断用户是不是点赞过该博客和收藏过该博客
     *
     * 调用方：
     *  1、浏览器-博客详细页面调用
     * @param sBlogId 博客id
     */
    @GetMapping("/operation")
    @AuthLogin
    public Result<Map<String, Object>> getUserLikeBlog(@RequestParam("blogId") String sBlogId) {
        log.info("开始查询用户是否点赞、收藏博客业务。blogId={}", sBlogId);
        if (StringUtils.isBlank(sBlogId)) {
            log.info("判断用户是否点赞和是否收藏博客接口请求参数错误");
            return Result.paramFail();
        }
        // 博客id类型转换
        Long blogId = Long.parseLong(sBlogId);
        // 获取当前正在执行获取用户关联博客信息操作的用户id
        Long userId = SecurityUtils.getUserId();

        Boolean likeBool = blogUserOperationService.getUserLikeBlog(userId, blogId);

        Boolean collectBool = blogUserOperationService.getUserCollectBlog(userId, blogId);

        log.info("查询用户是否点赞、收藏博客业务结束");
        Map<String, Object> data = new HashMap<>();
        data.put("likeBool", likeBool);
        data.put("collectBool", collectBool);
        return Result.success(data);
    }

    /**
     * 保存用户操作博客信息接口
     * 有以下四种操作
     * 1、用户点赞博客（添加新纪录）
     * 2、用户取消点赞博客（删除记录）
     * 3、用户收藏博客（添加新纪录）
     * 4、用户取消收藏博客（删除记录）
     *
     * 调用方：
     *  1、浏览器-博客详细页面调用
     *
     * 此接口会校验是否重复提交
     * @param blogUserOperationVo 封装请求参数的对象
     */
    @Resubmit(message = "操作博客")
    @PostMapping("/save/opt")
    @Auth(permit = "user:info:update")
    public Result<Object> saveUserBlogOperation(@RequestBody BlogUserOperationVo blogUserOperationVo){
        log.info("开始保存用户操作博客记录业务（点赞、取消点赞、收藏和取消收藏）：{}", blogUserOperationVo);
        if (StringUtils.isBlank(blogUserOperationVo.getBlogId()) || blogUserOperationVo.getFlag() == null
            || blogUserOperationVo.getOptType() == null) {
            log.info("保存用户操作博客信息接口请求参数错误");
            return Result.paramFail();
        }

        blogUserOperationService.saveUserBlogOperation(blogUserOperationVo);

        log.info("保存用户操作博客记录业务（点赞、取消点赞、收藏和取消收藏）结束");
        return Result.success();
    }

    /**
     * 保存用户评论博客信息接口（一级评论）
     *
     * 调用方：
     *  1、浏览器-博客详细页面调用
     *
     * 此接口会校验是否重复提交
     * @param commentVo 封装用户评论博客信息的对象
     */
    @Resubmit(message = "您的评论")
    @PostMapping("/save/one/comment")
    @Auth(permit = "user:save:comment")
    public Result<CommentDto> saveOneComment(@RequestBody BlogCommentVo commentVo){
        log.info("开始保存用户评论博客信息业务。{}", commentVo);

        if (Objects.isNull(commentVo.getBlogId()) || StringUtils.isBlank(commentVo.getContent())) {
            log.info("用户评论博客信息保存接口请求参数错误");
            return Result.paramFail();
        }

        CommentDto commentDto = blogCommentManager.saveOneComment(commentVo);

        log.info("保存用户评论博客信息业务结束");
        return Result.success(commentDto);
    }

    /**
     * 用户回复评论接口
     * 保存博客相互评论信息（一级以下评论）
     *
     * 调用方：
     *  1、浏览器-博客详细页面调用
     *
     * 此接口会校验是否重复提交
     * @param blogCommentVo 封装用户互相评论信息的对象
     */
    @Resubmit(message = "您的回复")
    @PostMapping("/save/child/comment")
    @Auth(permit = "user:save:comment")
    public Result<List<CommentDto>> saveChildComment(@RequestBody BlogCommentVo blogCommentVo) {
        log.info("开始保存用户互相评论信息业务。{}", blogCommentVo);

        if (Objects.isNull(blogCommentVo.getParentCommentId()) || Objects.isNull(blogCommentVo.getBlogId())
            || StringUtils.isBlank(blogCommentVo.getContent())) {
            log.info("用户回复评论接口请求参数错误");
            return Result.paramFail();
        }

        // 保存用户互相评论信息
        List<CommentDto> commentDtoList = blogCommentManager.saveChildComment(blogCommentVo);

        log.info("保存用户互相评论信息业务结束");
        return Result.success(commentDtoList);
    }

}
